package apmapi

import (
	"fmt"
	"service/app/api"
	"service/app/control"
	"service/app/dto"
	"service/app/mode"

	"github.com/gin-gonic/gin"
)

var (
	COSTGETALL     = 600001
	COSTEDIT       = 600002
	COSTDEL        = 600003
	COSTSEARCHTIME = 600004
)

type CostApi struct {
	api.BaseApi
	Cont *control.CostCont
}

func CostApiInit() *CostApi {
	return &CostApi{
		BaseApi: *api.BaseApi{}.BaseApiInit(),
		Cont:    control.CostContInit(),
	}
}

// @Summary 删除水电费单
// @Description
// @Param id path int true "roomId"
// @Router /api/v1/cost/{id} [DELETE]
// @Security ApiKeyAuth
// @Tags cost
// @Success 200 {object} api.ResponseJson "成功"
func (m CostApi) CostDel(ctx *gin.Context) {
	var id dto.ReqUriIdDto
	if err := m.BaseReqHandle(&api.IBaseApiParams{Ctx: ctx, Dto: &id, ReqUri: true, Valid: true}).GetBaseErr(); err != nil {
		m.Fail(api.ResponseJson{Msg: err.Error()})
		return
	}

	if err := m.Cont.CostDelC(&id); err != nil {
		m.Fail(api.ResponseJson{Msg: err.Error(), Code: COSTEDIT})
		return
	}
	m.Okay(api.ResponseJson{Msg: fmt.Sprintf("删除id: %v 水电费单成功！", id.Id)})
}

// @Summary 修改水电费单
// @Description
// @Param id path int true "roomId"
// @Router /api/v1/cost/{id} [PUT]
// @Security ApiKeyAuth
// @Param object body dto.CostAddDto true "水电费单"
// @Tags cost
// @Success 200 {object} api.ResponseJson "成功"
func (m CostApi) CostEdit(ctx *gin.Context) {
	var id dto.ReqUriIdDto
	if err := m.BaseReqHandle(&api.IBaseApiParams{Ctx: ctx, Dto: &id, ReqUri: true, Valid: true}).GetBaseErr(); err != nil {
		m.Fail(api.ResponseJson{Msg: err.Error()})
		return
	}
	var costAc dto.CostAddDto
	if err := m.BaseReqHandle(&api.IBaseApiParams{Ctx: ctx, Dto: &costAc, Valid: true}).GetBaseErr(); err != nil {
		m.Fail(api.ResponseJson{Msg: err.Error()})
		return
	}
	if err := m.Cont.CostEditC(&id, &costAc); err != nil {
		m.Fail(api.ResponseJson{Msg: err.Error(), Code: COSTEDIT})
		return
	}
	m.Okay(api.ResponseJson{Msg: fmt.Sprintf("修改id: %v 水电费单成功！", id.Id)})

}

// @Summary 获取cost数据表所有费用
// @Description
// @Security ApiKeyAuth
// @Router /api/v1/cost [GET]
// @Tags cost
// @Success 200 {object} []dto.CostAddDto "成功"
func (m CostApi) CostAll(ctx *gin.Context) {
	m.Ctx = ctx
	costList, err := m.Cont.CostAllC()
	if err != nil {
		m.Fail(api.ResponseJson{Code: COSTGETALL, Msg: err.Error()})
	}
	m.Okay(api.ResponseJson{Msg: "获取所有费用成功！", Data: &costList})
}

// @Summary 创建水电费单
// @Description
// @Security ApiKeyAuth
// @Router /api/v1/cost [POST]
// @Param object body dto.CostAddDto true "水电费单"
// @Tags cost
// @Success 200 {object} api.ResponseJson "成功"
func (m CostApi) CostAdd(ctx *gin.Context) {
	var costAc mode.Db_cost
	if err := m.BaseReqHandle(&api.IBaseApiParams{Ctx: ctx, Dto: &costAc}).GetBaseErr(); err != nil {
		m.Fail(api.ResponseJson{Msg: err.Error()})
		return
	}
	if err := m.Cont.CostAddC(&costAc); err != nil {
		m.Fail(api.ResponseJson{Msg: err.Error(), Code: APMCREAT})
		return
	}
	m.Okay(api.ResponseJson{Msg: "创建水电费单成功"})
}

// @Summary 选择时间段搜索,暂时限定二个月
// @Description query rang属性可以添加范围
// @Param time path dto.ReqUriTime true "time格式"
// @Param rang query dto.ReqUriRang true "rang为可选"
// @Security ApiKeyAuth
// @Param rang query
// @Router /api/v1/time/{time} [GET]
// @Tags cost
// @Success 200 {object} api.ResponseJson "成功"
func (m CostApi) CostSearchTime(ctx *gin.Context) {
	var acTime dto.ReqUriTime
	var id dto.ReqUriRang
	var searchRang = 1
	if err := m.BaseReqHandle(&api.IBaseApiParams{Ctx: ctx, Dto: &acTime, ReqUri: true}).GetBaseErr(); err != nil {
		m.Fail(api.ResponseJson{Msg: err.Error()})
		return
	}
	if err := m.BaseReqHandle(&api.IBaseApiParams{Ctx: ctx, Dto: &id, ReqQey: true}).GetBaseErr(); err != nil {
		m.Fail(api.ResponseJson{Msg: err.Error()})
		return
	}
	if id.Rang != 0 {
		searchRang = id.Rang
	}
	costList, err := m.Cont.CostSearchTimeC(&acTime, searchRang)
	if err != nil {
		m.Fail(api.ResponseJson{Msg: err.Error(), Code: COSTSEARCHTIME})
		return
	}
	m.Okay(api.ResponseJson{Msg: fmt.Sprintf("获取:%v 时间段搜索,搜索范围为 %v 个月", acTime, searchRang), Data: costList})
}
